//
//  YFStatusViewModel.swift
//  仿新浪微博
//
//  Created by 杨帆 on 16/7/6.
//  Copyright © 2016年 杨帆. All rights reserved.
//

import Foundation

// 单条微博的视图模型

class YFStatusViewModel: CustomStringConvertible {

    // 微博模型
    var status :YFStatus
    
    // 会员图标
    var memberIcon: UIImage?
    
    // 认证类型
    var vipIcon: UIImage?
    
    // 转发文字
    var retweetedStr: String?
    // 评论文字
    var commentStr: String?
    // 点赞文字
    var likeStr: String?
    
    // 配图视图大小
    var pictureViewSize = CGSize()
    
    // 如果是被转发的微博 原创微博一定没图
    var picURLs: [YFStatusPicture]? {
    
        return status.retweeted_status?.pic_urls ?? status.pic_urls
    }

    // 微博正文的属性文本
    var statusAttrText: AttributedString?
    
    // 转发文字的属性文本
    var retweetedAttrText: AttributedString?
    
    // 行高
    var rowHeight: CGFloat = 0
    
    // 构造函数
    
    init(model: YFStatus) {
        
        self.status = model
        
        // 直接计算出会员图标/会员等级
        if model.user?.mbrank > 0 && model.user?.mbrank < 7 {
        
            let imageName = "common_icon_membership_level\(model.user?.mbrank ?? 1)"
            
            memberIcon = UIImage(named: imageName)
        }
        // 认证图标
        switch model.user?.verified_type ?? -1 {
        case 0:
            vipIcon = UIImage(named: "avatar_vip")
        case 2, 3, 5:
            vipIcon = UIImage(named: "avatar_enterprise_vip")
        case 220:
            vipIcon = UIImage(named: "avatar_grassroot")
        default:
            break
        }

        // model.reposts_count = Int(arc4random_uniform(100000))
        retweetedStr = countString(count: model.reposts_count, defaultStr: "转发")
        commentStr = countString(count: model.comments_count, defaultStr: "评论")
        likeStr = countString(count: model.attitudes_count, defaultStr: "赞")
        
        // 计算配图视图大小
        pictureViewSize = calcPictureViewSize(count: picURLs?.count)
        
        // ----设置微博文本----
        let originalFont = UIFont.systemFont(ofSize: 15)
        let retweetedFont = UIFont.systemFont(ofSize: 14)
            
        // 微博正文的属性文本
            statusAttrText = CZEmoticonManager.shared.emoticonString(string: model.text ?? "", font: originalFont)
                
        // 设置被转发微博的属性文本
        let rText = "@" + (status.retweeted_status?.user?.screen_name ?? "")
            
        + ":"
        + (status.retweeted_status?.text ?? "" )
        
        retweetedAttrText = CZEmoticonManager.shared.emoticonString(string: rText, font: retweetedFont)
        // 计算行高
        updateRowHeight()


    }
    
    // 计算指定数量的图片对应的配图视图的大小
    var description: String {
    
        return status.description
    }
    
    // 根据当前视图内容计算行高
    func updateRowHeight() {
        // 原创微博：顶部分隔视图(12) + 间距(12) + 图像的高度(34) + 间距(12) + 正文高度(需要计算) + 配图视图高度(计算) + 间距(12) ＋ 底部视图高度(35)
        // 被转发微博：顶部分隔视图(12) + 间距(12) + 图像的高度(34) + 间距(12) + 正文高度(需要计算) + 间距(12)+间距(12)+转发文本高度(需要计算) + 配图视图高度(计算) + 间距(12) ＋ 底部视图高度(35)

        let margin: CGFloat = 12
        let iconHeight: CGFloat = 34
        let toolbarheight: CGFloat = 35
        
        var height: CGFloat = 0
        
        let viewSize = CGSize(width: UIScreen.cz_screenWidth() - 2 * margin, height: CGFloat(MAXFLOAT))
        
        // 1. 计算顶部位置
        height = 2 * margin + iconHeight + margin
        
        // 2. 正文属性文本的高度
        if let text = statusAttrText {
        
            height += text.boundingRect(with: viewSize, options: [.usesLineFragmentOrigin], context: nil).height
        }
        
            // 3. 判断是否转发微博
            if status.retweeted_status != nil {
                
                height += 2 * margin
                
                // 转发文本的高度
                if let text = retweetedAttrText {
                
                    height += text.boundingRect(with: viewSize, options: [.usesLineFragmentOrigin], context: nil).height
                }
            }
            
            // 4. 配图视图
            height += pictureViewSize.height
            
            height += margin
            
            // 5. 底部工具栏
            height += toolbarheight
            
            // 6. 使用属性记录
            rowHeight = height
    }
    
    // 使用单个图像 更新配图视图的大小
    func updateSingleImageSize(image: UIImage) {
    
        var size = image.size
        
        // 尺寸需要增加顶部的12个点
        size.height += YFStatusPictureViewInnerMargin
        
        // 重新设置配图视图大小
        pictureViewSize = size
        
        let maxWidth: CGFloat = 300
        let minWidth: CGFloat = 40
        
        // 过宽图像处理
        if size.width > maxWidth {
        
            // 设置最大宽度
            size.width = maxWidth
            
            // 等比例调整高度
            size.height = size.width * image.size.height / image.size.width
        }
        
        // 过窄图像处理
        if size.width < maxWidth {
        
            size.width = minWidth
            
            // 要特殊处理高度 窦泽高度太大 影响用户体验
            size.height = size.width * image.size.height / image.size.width / 4
        }
        
        // 注意，尺寸需要增加顶部的 12 个点，便于布局
        size.height += YFStatusPictureViewOutterMargin
        
        // 重新设置配图视图大小
        pictureViewSize = size
        
        // 更新行高
        updateRowHeight()
        
        
    }
    // 计算指定数量的图片对应的配图视图的大小
    private func calcPictureViewSize(count: Int?) -> CGSize {
        
        if count == 0 || count == nil {
            return CGSize()
        }
        
        // 2. 计算高度
        // 1> 根据 count 知道行数 1 ~ 9
        /**
         1 2 3 = 0 1 2 / 3 = 0 + 1 = 1
         4 5 6 = 3 4 5 / 3 = 1 + 1 = 2
         7 8 9 = 6 7 8 / 3 = 2 + 1 = 3
         */
        let row = (count! - 1) / 3 + 1
        
        // 2> 根据行数算高度
        var height = YFStatusPictureViewOutterMargin
        height += CGFloat(row) * YFStatusPictureItemWidth
        height += CGFloat(row - 1) * YFStatusPictureViewInnerMargin
        
        return CGSize(width: YFStatusPictureViewWidth, height: height)

        


    }

    // 2. 计算高度
    // 如果数量 == 0，显示默认标题
    // 如果数量超过 10000，显示 x.xx 万
    // 如果数量 < 10000，显示实际数字

    private func countString(count: Int, defaultStr: String) -> String {
        
        if count == 0 {
            return defaultStr
        }
        
        if count < 10000 {
            return count.description
        }
        
        return String(format: "%.02f 万", Double(count) / 10000)
    }

}
